//
//  DeviceManager.swift
//  EasyDana
//
//  Created by mac on 2024/10/8.
//

import Foundation
import AdSupport
import SystemConfiguration
import KeychainSwift
import MachO
import Network
import AppTrackingTransparency
class DeviceManager {
    static let `defalult` = DeviceManager()
    
    var deviceName: String {
        var name: utsname = utsname()
        uname(&name)
        let internalName = withUnsafePointer(to: &name.machine) {
            $0.withMemoryRebound(to: CChar.self, capacity: 1) {
                String(cString: $0)
            }
        }
        let dict = [
            // iPhone
            "iPhone1,1" : "iPhone",
            "iPhone1,2" : "iPhone 3G",
            "iPhone2,1" : "iPhone 3GS",
            "iPhone3,1" : "iPhone 4",
            "iPhone3,2" : "iPhone 4",
            "iPhone3,3" : "iPhone 4",
            "iPhone4,1" : "iPhone 4S",
            "iPhone5,1" : "iPhone 5",
            "iPhone5,2" : "iPhone 5",
            "iPhone5,3" : "iPhone 5c",
            "iPhone5,4" : "iPhone 5c",
            "iPhone6,1" : "iPhone 5s",
            "iPhone6,2" : "iPhone 5s",
            "iPhone7,2" : "iPhone 6",
            "iPhone7,1" : "iPhone 6 Plus",
            "iPhone8,1" : "iPhone 6s",
            "iPhone8,2" : "iPhone 6s Plus",
            "iPhone8,4" : "iPhone SE (1st generation)",
            "iPhone9,1" : "iPhone 7",
            "iPhone9,3" : "iPhone 7",
            "iPhone9,2" : "iPhone 7 Plus",
            "iPhone9,4" : "iPhone 7 Plus",
            "iPhone10,1" : "iPhone 8",
            "iPhone10,4" : "iPhone 8",
            "iPhone10,2" : "iPhone 8 Plus",
            "iPhone10,5" : "iPhone 8 Plus",
            "iPhone10,3" : "iPhone X",
            "iPhone10,6" : "iPhone X",
            "iPhone11,8" : "iPhone XR",
            "iPhone11,2" : "iPhone XS",
            "iPhone11,6" : "iPhone XS Max",
            "iPhone11,4" : "iPhone XS Max",
            "iPhone12,1" : "iPhone 11",
            "iPhone12,3" : "iPhone 11 Pro",
            "iPhone12,5" : "iPhone 11 Pro Max",
            "iPhone12,8" : "iPhone SE (2nd generation)",
            "iPhone13,1" : "iPhone 12 mini",
            "iPhone13,2" : "iPhone 12",
            "iPhone13,3" : "iPhone 12 Pro",
            "iPhone13,4" : "iPhone 12 Pro Max",
            "iPhone14,4" : "iPhone 13 mini",
            "iPhone14,5" : "iPhone 13",
            "iPhone14,2" : "iPhone 13 Pro",
            "iPhone14,3" : "iPhone 13 Pro Max",
            "iPhone14,6" : "iPhone SE (3rd generation)",
            "iPhone14,7" : "iPhone 14",
            "iPhone14,8" : "iPhone 14 Plus",
            "iPhone15,2" : "iPhone 14 Pro",
            "iPhone15,3" : "iPhone 14 Pro Max",
            // iPad
            "iPad1,1" : "iPad",
            "iPad2,1" : "iPad 2",
            "iPad2,2" : "iPad 2",
            "iPad2,3" : "iPad 2",
            "iPad2,4" : "iPad 2",
            "iPad3,1" : "iPad (3rd generation)",
            "iPad3,2" : "iPad (3rd generation)",
            "iPad3,3" : "iPad (3rd generation)",
            "iPad3,4" : "iPad (4th generation)",
            "iPad3,5" : "iPad (4th generation)",
            "iPad3,6" : "iPad (4th generation)",
            "iPad6,11" : "iPad (5th generation)",
            "iPad6,12" : "iPad (5th generation)",
            "iPad7,5" : "iPad (6th generation)",
            "iPad7,6" : "iPad (6th generation)",
            "iPad7,11" : "iPad (7th generation)",
            "iPad7,12" : "iPad (7th generation)",
            // iPad Air
            "iPad4,1" : "iPad Air",
            "iPad4,2" : "iPad Air",
            "iPad4,3" : "iPad Air",
            "iPad5,3" : "iPad Air 2",
            "iPad5,4" : "iPad Air 2",
            "iPad11,3" : "iPad Air (3rd generation)",
            "iPad11,4" : "iPad Air (3rd generation)",
            // iPad Pro
            "iPad6,7" : "iPad Pro (12.9-inch)",
            "iPad6,8" : "iPad Pro (12.9-inch)",
            "iPad6,3" : "iPad Pro (9.7-inch)",
            "iPad6,4" : "iPad Pro (9.7-inch)",
            "iPad7,1" : "iPad Pro (12.9-inch) (2nd generation)",
            "iPad7,2" : "iPad Pro (12.9-inch) (2nd generation)",
            "iPad7,3" : "iPad Pro (10.5-inch)",
            "iPad7,4" : "iPad Pro (10.5-inch)",
            "iPad8,1" : "iPad Pro (11-inch)",
            "iPad8,2" : "iPad Pro (11-inch)",
            "iPad8,3" : "iPad Pro (11-inch)",
            "iPad8,4" : "iPad Pro (11-inch)",
            "iPad8,5" : "iPad Pro (12.9-inch) (3rd generation)",
            "iPad8,6" : "iPad Pro (12.9-inch) (3rd generation)",
            "iPad8,7" : "iPad Pro (12.9-inch) (3rd generation)",
            "iPad8,8" : "iPad Pro (12.9-inch) (3rd generation)",
            "iPad8,9" : "iPad Pro (11-inch) (2nd generation)",
            "iPad8,10" : "iPad Pro (11-inch) (2nd generation)",
            "iPad8,11" : "iPad Pro (12.9-inch) (4th generation)",
            "iPad8,12" : "iPad Pro (12.9-inch) (4th generation)",
            // iPad mini
            "iPad2,5" : "iPad mini",
            "iPad2,6" : "iPad mini",
            "iPad2,7" : "iPad mini",
            "iPad4,4" : "iPad mini 2",
            "iPad4,5" : "iPad mini 2",
            "iPad4,6" : "iPad mini 2",
            "iPad4,7" : "iPad mini 3",
            "iPad4,8" : "iPad mini 3",
            "iPad4,9" : "iPad mini 3",
            "iPad5,1" : "iPad mini 4",
            "iPad5,2" : "iPad mini 4",
            "iPad11,1" : "iPad mini (5th generation)",
            "iPad11,2" : "iPad mini (5th generation)",
            //other
            "i386":"iPhone Simulator",
            "x86_64":"iPhone Simulator",
        ];
        if let model = dict[internalName] {
            return model
        }
        return ""
    }
    
    var idfv: String {
        let keychain = KeychainSwift()
        if let idfv = keychain.get("easydana") {
            print(idfv)
            return idfv
        }
        let id = UIDevice.current.identifierForVendor?.uuidString ?? ""
        keychain.set(id, forKey: "easydana")
        print(id)
        return id
    }
    
    func idfa() async -> String {
        if #available(iOS 14, *) {
            return await withCheckedContinuation { continuation in
                ATTrackingManager.requestTrackingAuthorization { status in
                    let id = ASIdentifierManager.shared().advertisingIdentifier.uuidString
                    continuation.resume(returning: id)
                }
            }
        } else {
            return ASIdentifierManager.shared().advertisingIdentifier.uuidString
            // Fallback on earlier versions
        }
    }
    
    var isProxy: Bool {
        let config = URLSessionConfiguration.default
        if let proxy = config.connectionProxyDictionary {
            let httpEnabled = proxy[kCFNetworkProxiesHTTPEnable as String] as? Bool ?? false
            return httpEnabled
        }
        return false
    }
    
    var isVPN: Bool {
        return self.isProxy
    }
    
    var availableDiskSize: String {
        let fileURL = NSURL(fileURLWithPath: "/")
        do {
            let results = try fileURL.resourceValues(forKeys: [.volumeAvailableCapacityForImportantUsageKey])
            let size = results[.volumeAvailableCapacityForImportantUsageKey] as! Int
            return "\(size)"
        } catch {
            return "0"
        }
    }//可用磁盘空间
    
    var totalDiskSize: String {
        var buf: statfs = statfs()
        var totalDiskSize: UInt64 = 0
        if statfs("/var", &buf) >= 0 {
            totalDiskSize = UInt64(buf.f_bsize) * buf.f_blocks
        }
        return "\(totalDiskSize)"
    }//总磁盘空间
    
    var totalMemorySize: String {
        let totalSize = ProcessInfo.processInfo.physicalMemory
        return "\(totalSize)"
    }//总内存大小
    
    var availableMemorySize: String {
        return "\(OCTool.availableMemory())"
    }//可用内存大小
    
    var chargeLevel: Int {
        UIDevice.current.isBatteryMonitoringEnabled = true
        let value = Int(UIDevice.current.batteryLevel * 100)
        return value
    }//电量百分比
    
    var charging: Int {
        return UIDevice.current.batteryState == .charging ? 1 : 0
    }//是否正在充电
    
    var systemVersion: String {
        return UIDevice.current.systemVersion
    }//系统版本
    
    var brand: String {
        return "iPhone"
    }//手机品牌
    
    var originPhoneModel: String {
        var name: utsname = utsname()
        uname(&name)
        let internalName = withUnsafePointer(to: &name.machine) {
            $0.withMemoryRebound(to: CChar.self, capacity: 1) {
                String(cString: $0)
            }
        }
        return internalName
    }//原始设备型号
    
    var isSimulator: Int {
        return 0
    }//是否为模拟器
    
    var isJailBroken: Int {
        let broken = UIApplication.shared.canOpenURL(URL(string: "cydia://")!)
        return broken ? 1 : 0
    }//是否为越狱机器
    
    var timeZone: String {
        return NSTimeZone.default.identifier
    }//时区
    
    var language: String {
        if let language = UserDefaults.standard.array(forKey: "AppleLanguages")?.first as? String {
            return language
        }
        return ""
    }//语言
    
//    var netType: String {
//        return ""
//    }//网络类型
    
    func getNetworkType() async -> String {
        return await withCheckedContinuation { continuation in
            OCTool.getNetworkType { string in
                continuation.resume(returning: string)
            }
        }
    }
    
    func getConnectedWifiInfo() -> [String: Any] {
        return OCTool.fetchSSIDInfo() as? [String: Any] ?? [:]
    }
    
    var mac: String {
        return ""
    }//mac地址
    
    var ssid: String {
        return ""
    }
    
    
    
}
